/**
 * 修改记录:
 * 25-09-11     郑朝军
 */

/**
 * uni.cxapp.FormValidation
 * ZGIS-表单验证相关方法
 *
 * @class
 * @memberof    uni.cxapp.FormValidation
 */
export default 
{
  methods: 
  {    
    /**
     * 数据校验（IAttController接口方法）
     * @returns {boolean} 校验结果
     */
    async checkData() 
    {   
      try 
      {
        // 表单组件验证
        await this.$refs.form.validate()
      
        // 规则表检查结果
        let ruleTabCheckResult = true

        if (this.isAddMode()) 
        {
          ruleTabCheckResult = this.handleRuleTab(this.ruleTabCheckTime.commit)
        } 
        else if (this.isEditMode()) 
        {
          ruleTabCheckResult = this.handleRuleTab(this.ruleTabCheckTime.editCommit)
        }

        // 检验规则表
        if (!ruleTabCheckResult) 
        {
          return false
        }

        // 检查附件是否可以为空
        if (!this.attachNullAble && this.internalFileController.fileList.length === 0) 
        {
          this.showErrorMsg('附件不能为空')
          return false
        }

      } 
      catch (error) 
      {
        uni.cxapp.Toast('表单验证失败！')
        console.error('表单验证失败:', error)
        return false
      }
      return true
    },
 
    /**
     * 匹配规则表（IAttController接口方法）
     * @param {string} checkTime 检查时机
     * @returns {boolean} 处理结果
     */
    handleRuleTab(checkTime) 
    {
      // 实现规则表处理逻辑
      // 这里需要根据具体的规则表配置来实现  
      // 模拟规则表处理
      if(this.ruleTabCheckTime.new === checkTime || this.ruleTabCheckTime.edit === checkTime)
      {
        const flds = uni.cxapp.TabRuleUtil.initAddOrEdit(this.ruleTabList, this.getTabName(), this.internalFldList)    
        if (flds)
        {
          this.internalFldList = flds
        }  
      }
      else if(this.ruleTabCheckTime.change === checkTime)
      {
        const flds = uni.cxapp.TabRuleUtil.initChange(this.ruleTabList, this.getTabName(), this.internalFldList)       
        if (flds.length) 
        {
          flds.forEach(async (item) => 
          {                               
            // flds中的colename值不等于fld中的colname值时触发，否则会触发死循环
            if (item.colname != this.editingColName) 
            {
              this.internalFldList.forEach((fldItem) => 
              {
                if (fldItem.colname == item.colname) 
                {
                  if (item.key == 'required') 
                  {
                    this.$set(fldItem, 'nullable', uni.cxapp.CxObjUtil.strToBool(item.value) ? 0 : 1)
                  } 
                  else if (item.key == 'editable') 
                  {
                    this.$set(fldItem, 'editable', uni.cxapp.CxObjUtil.strToBool(item.value) ? 1 : 0)
                  } 
                  else 
                  {                  
                    this.$set(fldItem, item.key, item.value == uni.cxapp.CxConst.TEXT_NULLVAL ? '' : item.value)
                  }
                }
              })
  
              // 执行动态函数
              if (uni.cxapp.ruletab && item.func) 
              {
                await uni.cxapp.ruletab[item.func]({fld: this.editingColName, flds: this.internalFldList})          
              }
            }
          })
        }
      }
      else if(this.ruleTabCheckTime.commit === checkTime || this.ruleTabCheckTime.editCommit === checkTime)
      {
        const checkValue = uni.cxapp.TabRuleUtil.initCheck(this.ruleTabList, this.internalAttMap, this.getTabName(), this.internalFldList)
        if (Object.keys(checkValue).length > 0) 
        {
          this.internalAttMap = checkValue
        }
      }        
      return true
    },

    /**
     * 获取字段验证器
     * @param {Object} fld 字段对象
     * @returns {Object|null} 验证器对象
     */
    getFldValidator(fld) 
    {
      let validRule
      // 1. 处理字段fld的params参数
      const params = this.parseFieldParams(fld)
      if (!params) return
      // 2. 处理字段的格式化、可视化和验证规则      
      Object.entries(params).forEach(([type, value]) => 
      {
        validRule = this.getFldValidationRule(type, value, fld)
      }) 
      // 实现字段验证器逻辑
      return validRule
    },

    /**
     * 设置字段验证规则
     * @param   {Object}    fld       字段对象
     * @param   {String}    typeValue 验证规则参数
     */
    getFldValidationRule(fld, typeValue) 
    {
      const validator = uni.cxapp.Validator.makeValid(typeValue)
      if (!validator) return      
      const validRule = uni.cxapp.FormPeculiarity.handleValid(fld, validator)
      return validRule
    },     
  }
}